Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 << zurück
Visual C# 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2005

Visual C# 2005
1.320 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-586-X
gp Kapitel 13 Serialisierung
  gp 13.1 Serialisierungsverfahren
  gp 13.2 Serialisierung mit »BinaryFormatter«
  gp 13.3 Serialisierung mit »SoapFormatter«
  gp 13.4 Serialisierung mit »XmlSerializer«
    gp 13.4.1 XML-Serialisierung mit Attributen steuern


Galileo Computing

13.4 Serialisierung mit »XmlSerializer«  downtop

Die Serialisierung mit der Klasse XmlSerializer, die zum Namespace System.Xml.Serialization.XmlSerializer gehört, unterscheidet sich gravierend von den Klassen BinaryFormatter und SoapFormatter:

gp  Die im XML-Format zu serialisierende Klasse muss public definiert sein.
gp  Es werden nur public deklarierte Instanzfelder serialisiert. Öffentliche statische Felder werden in den Serialisierungsprozess nicht mit einbezogen.
gp  Die zu serialisierende Klasse muss einen öffentlichen, parameterlosen Konstruktor haben. Dieser wird von XmlSerializer aufgerufen.
gp  Die Steuerung der XML-Serialisierung erfolgt mit Attributen, die im Namespace System.Xml.Serialization zu finden sind. Damit ist es beispielsweise möglich, bestimmte Felder vom Serialisierungsprozess auszuschließen.
gp  Im Gegensatz zu BinaryFormatter und SoapFormatter ist das Serializable-Attribut nicht zwingend vorgeschrieben.

Obwohl unter Nutzung aller sich bietenden Möglichkeiten die XML-Serialisierung aufwändiger zu programmieren ist, hat sie einen entscheidenden Vorteil: XML ist ein offener Standard und deshalb plattformunabhängig. Die auf diese Weise serialisierten Daten lassen sich folglich von beliebigen Anwendungen verarbeiten.

Im folgenden Beispiel wird das gezeigt. Um einen Vergleich zu haben, soll dazu das Beispiel BinaryFormatter entsprechend umgeschrieben werden. Da ClassA im Ausgangsbeispiel einen parametrisierten Konstruktor aufweist, der den Standardkonstruktor ausblendet, muss die Klassendefinition um einen parameterlosen Konstruktor ergänzt werden. Sehen wir uns jetzt den Code des Beispiels an.


// -------------------------------------------------------------
// Beispiel: ...\Kapitel 13\XMLSerialisierung
// -------------------------------------------------------------
using System;
using System.IO;
using System.Xml.Serialization;
class Class1 {
  static XmlSerializer xmlSer;
  static FileStream myStream;
  static void Main(string[] args) {
    xmlSer = new XmlSerializer(typeof(ClassA));
    ClassA obj = new ClassA(310, "Peter");
    SerializeObject(obj);
    ClassA oldObj = DeserializeObject();
    Console.WriteLine(oldObj.intVar);
    Console.WriteLine(oldObj.Name);
    Console.ReadLine();
  }
  // Objekt serialisieren
  public static void SerializeObject(object obj) {
    myStream = new FileStream("C:\\MyObject.dat", FileMode.Create);
    xmlSer.Serialize(myStream, obj);
    myStream.Close();
  }
  // Objekt deserialisieren
  public static ClassA DeserializeObject() {
    FileStream fs = new FileStream("C:\\MyObject.dat", 
    FileMode.Open);
    return (ClassA)xmlSer.Deserialize(fs);
  }
}
public class ClassA {
  public int intVar;
  private string strName;
  // ----- Konstruktoren -----
  public ClassA() {}
  public ClassA(int x, string str) { 
    intVar = x;
    strName = str;
  }
  public string Name {
    get {return strName;}
    set {strName = value;}
  }
}

Das Serialisierungsobjekt vom Typ XmlSerializer ersetzt das von uns vorher benutzte BinaryFormatter-Objekt. Dazu wird ein Konstruktor aufgerufen, der die Type-Angabe über das zu serialisierende Objekt entgegennimmt.


xmlSer = new XmlSerializer(typeof(ClassA));

Sehen wir uns zum Abschluss noch den Inhalt der XML-Datei an:


<?xml version="1.0"?>
<ClassA xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <intVar>310</intVar>
  <Name>Peter</Name>
</ClassA>


Galileo Computing

13.4.1 XML-Serialisierung mit Attributen steuern  toptop

Sie wissen nun, wie Sie Daten aus einem Objekt in XML serialisieren und übertragen können. Die XML-Serialisierung lässt sich darüber hinaus mit zusätzlichen Attributen steuern und das Ausgabeformat der serialisierten Daten bestimmen.

Diese Attribute gehören zum Namespace System.Xml.Serialization. Die folgende Tabelle gibt einen kleinen Überblick über die wichtigsten Attribute.


Tabelle 13.2   Attribute zur Steuerung der Ausgabe in einer XML-Datei

Attribut Beschreibung
XmlArray Gibt an, dass ein bestimmtes Klassen-Member als Array serialisiert werden soll.
XmlArrayItem Legt den Bezeichner in der XML-Datei für den vom Array verwalteten Typ fest.
XmlAttribute Die Eigenschaft wird als XML-Attribut und nicht als XML-Element serialisiert.
XmlElement Dieses Attribut legt den Elementnamen in der XML-Datei fest. Standardmäßig wird der Bezeichner des Feldes verwendet.
XmlIgnore Legt fest, dass die Eigenschaft nicht serialisiert werden soll.
XmlRoot Legt den Bezeichner des Wurzelelements der XML-Datei fest. Standardmäßig wird der Bezeichner der zu serialisierenden Klasse verwendet.

Am folgenden Beispiel wollen wir uns die Wirkungsweise der Attribute verdeutlichen. In der Anwendung ist die Klasse Person definiert. Mehrere Objekte vom Typ Person können von einem Objekt der Klasse Personenliste verwaltet werden.


// -------------------------------------------------------------
// Beispiel: ...\Kapitel 13\XMLAttributeDemo
// -------------------------------------------------------------
using System.Xml.Serialization;
using System.IO;
...
[XmlRoot("PersonenListe")]
public class PersonenListe {
  [XmlElement("Listenbezeichner")]
  public string Listenname;    
  [XmlArray("PersonenArray")]
  [XmlArrayItem("PersonObjekt")]
  public Person[] Personen;
  // Konstruktoren
  public PersonenListe() { }
  public PersonenListe(string name) {
    this.Listenname = name;
  }
}
public class Person {
  [XmlElement("Name")]
  public string Zuname;
  [XmlElement("Wohnort")]
  public string Ort;
  [XmlElement("Alter")]
  public int Lebensalter;
  [XmlAttribute("PersID", DataType = "string")]
  public string ID;
  // Konstruktoren
  public Person() { }
  public Person(string zuname, string ort, int alter, string id) {
    this.Zuname = zuname;
    this.Ort = ort;
    this.Lebensalter = alter;
    this.ID = id;
  }
}

Ehe wir uns die Auswirkung der Attributierung ansehen, hier zuerst der Code, der Person-Objekte mit XmlSerializer serialisiert.


class Program {
  static void Main(string[] args) {
    PersonenListe catalog = new PersonenListe("Teilnehmerliste");
    catalog.Listenname = "Teilnehmerliste";
    Person[] persons = new Person[2];
    // Personen erzeugen
    persons[0] = new Person("Peter", "Berlin", 45, "117");
    persons[1] = new Person();
    persons[1].Zuname = "Franz-Josef";
    persons[1].Ort = "Aschaffenburg";
    catalog.Personen = persons;
    // serialisieren
    XmlSerializer serializer = new XmlSerializer(typeof(PersonenListe));
    FileStream fs = new FileStream("Personenliste.xml", FileMode.Create);
    serializer.Serialize(fs, catalog);
    fs.Close();
    catalog = null;
    // deserialisieren
    fs = new FileStream("Personenliste.xml", FileMode.Open);
    catalog = (PersonenListe)serializer.Deserialize(fs);
    serializer.Serialize(Console.Out, catalog);
    Console.ReadLine();
  }
}

Das Array persons beschreibt ein Array von Person-Objekten, das zwei Objekte dieses Typs enthält. Die Referenz auf persons wird der Eigenschaft Personen eines PersonenListe-Objekts zugewiesen. Danach erfolgt die Serialisierung mit XmlSerializer in eine XML-Datei.

Nach der Serialisierung wird die Datei deserialisiert und ein serialisierender Datenstrom erzeugt, der in der Konsole seinen Abnehmer findet. So können wir uns den Inhalt des XML-Stroms direkt im Konsolenfenster ansehen, ohne die XML-Datei öffnen zu müssen.


<?xml version="1.0" encoding="ibm850"?>
<PersonenListe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Listenbezeichner>Teilnehmerliste</Listenbezeichner>
  <PersonenArray>
    <PersonObjekt PersID="117">
      <Name>Peter</Name>
      <Wohnort>Berlin</Wohnort>
      <Alter>45</Alter>
    </PersonObjekt>
    <PersonObjekt>
      <Name>Franz-Josef</Name>
      <Wohnort>Aschaffenburg</Wohnort>
      <Alter>0</Alter>
    </PersonObjekt>
  </PersonenArray>
</PersonenListe>

Beachten Sie, wie die Verwendung der Attribute Einfluss auf die Elementbezeichner in der XML-Ausgabe haben.

 << zurück
  
  Zum Katalog
Zum Katalog: Visual C# 2005
Visual C# 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Visual Basic 2005






 Visual Basic 2005


Zum Katalog: Java ist auch eine Insel






 Java ist auch eine
 Insel


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de